// 加载本地存储的方法
import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth';
// 导入登录请求的方法
import { login, getUserInfo, getUserBaseInfo } from '@/api/user';

// 导入重置路由的方法
import { resetRouter } from '@/router/index.js';

// 状态
const state = {
  // 初始化token的状态
  token: getToken(),
  // 定义一个存储用户信息的对象
  userInfo: {},
};

const mutations = {
  // 修改toekn  注意，editToken里面的第二个参数是payload，现在换成了token
  editToken(state, token) {
    // 将token值存储到vuex里面的state里面token值;
    state.token = token;
    // 将vuex里面的token值同步到本地存储
    setToken(token);
  },

  // 删除token,这里不需要传一个payload
  deleteToken(state) {
    state.token = null;
    removeToken();
  },

  // 定义一个修改state里面的用户信息的mutations
  editUserInfo(state, result) {
    state.userInfo = result;
  },

  // 定义一个删除用户信息的mutations
  removeUserInfo(state) {
    state.userInfo = {};
  },
};

const actions = {
  // 这里发送登录请求，并且通知mutations来修改state
  async sendLogin(context, data) {
    // 发送登录请求
    const result = await login(data);
    // 注意：经过响应拦截器处理之后，这里的result已经是token了，不需要再进行解构了，也不需要进行success的判定了，
    // 因为如果进入到这里来了一定是响应成功了
    // if (result.data.success) {
    //   // 响应成功，将用户token存储起来
    //   context.commit('editToken', result.data.data);
    // } else {
    //   // 请求失败
    //   console.log(message);
    // }
    context.commit('editToken', result);
    // 登录请求发送成功之后，在来存入时间戳
    setTimeStamp();
  },
  // 这里发送获取用户信息的请求，并且通知mutations来修改state
  async sendGetUserInfo(context) {
    // 注意：在这里拿到的都是响应成功后的数据,因为在响应拦截器里面的已经处理过了
    const result = await getUserInfo();
    // 在这里发送请求获取用户的基本详情
    const userBaseInfo = await getUserBaseInfo(result.userId);
    // 定义一个对象来存储result和userBaseInfo数据
    const obj = { ...result, ...userBaseInfo };
    context.commit('editUserInfo', obj);
    return result; // 后续有用
  },
  // 定义一个退出登录的方法,来通知mutations删除token和用户信息
  loginOut(context) {
    //  删除token
    context.commit('deleteToken');
    // 删除用户信息
    context.commit('removeUserInfo');
    // 重置路由
    resetRouter();
    // 调用permission模块里面的mutations方法来清除添加的路由，由于两个vuex子模块都是加了命名空间的，将路由重新设置为空
    context.commit('permission/setRoutes', [], { root: true });
  },
};

export default {
  namespaced: true,
  state,
  mutations,
  actions,
};
